# 关于数字、数学的一些计算和函数 

# 字面量
# 进制数字
# 二进制：0b 开头，例如 0b1010 表示 10。
# 八进制：0o 开头，例如 0o310 表示 200。
# 十六进制：0x 开头，例如 0x12c 表示 300。
a = 0b1010 #二进制字面量 0b 表示二进制
b = 100 #十进制字面量
c = 0o310 #八进制字面量 0o 表示八进制
d = 0x12c #十六进制字面量 0x 表示十六进制

# Float 字面量
float_1 = 10.5 
float_2 = 1.5e2

# Complex 字面量
x = 3.14j

print(a, b, c, d) # 10 100 200 300
print(float_1, float_2) # 10.5 150.0（1.5 * 10^2）
print(x, x.imag, x.real) # 3.14j 3.14 0.0

# 内置函数，数据类型转换
# int() 函数用于将一个字符串或数字转换为整型。
# float() 函数用于将一个字符串或数字转换为浮点型。
# str() 函数用于将指定的对象转换为一个字符串。
# complex() 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数, real 实部，imag 虚部。
int(3.14) # 3
float(3) # 3.0
str(3) # '3'
complex(3) # (3+0j)
complex(3, 4) # (3+4j)
complex('3+4j') # (3+4j)
# ... ...

# 小数 decimal (十进制模块 decimal: 解决float 0.1+0.2!=0.3 问题。)
# 为什么不每次都执行Decimal而不是float？主要原因是效率。进行浮点运算必须比十进制运算更快。
from decimal import Decimal as D
# 输出: Decimal('3.3')
print(D('1.1') + D('2.2'))
# 输出: Decimal('3.000')
print(D('1.2') * D('2.50'))
# ... ...

# 分数 fractions
import fractions as f
print(f.Fraction(1, 3)) # 输出: 1/3
# float 转换为分数
print(f.Fraction(1.1)) # 输出: 2476979795053773/2251799813685248
print(f.Fraction("1.1")) # 输出: 11/10
print(f.Fraction(1.1).limit_denominator(10)) # 输出: 11/10
# 简化版本
from fractions import Fraction as F
print(F(1, 3)) # 输出: 1/3
print(F(1.1)) # 输出: 2476979795053773/2251799813685248
print(F("1.1")) # 输出: 11/10
# ... ...

# 数学 math [https://www.cainiaojc.com/python/python-modules-math.html]
import math as m
print(m.pi) # 输出: 3.141592653589793
print(m.e) # 输出: 2.718281828459045
print(m.sqrt(16)) # 输出: 4.0; sqrt: 返回x的平方根
print(m.sin(m.pi/2)) # 输出: 1.0
print(m.radians(45)) # 输出: 0.7853981633974483; radians: 将角度x从度转换为弧度
print(m.pow(2, 5)) # 输出: 32.0; pow: 返回x的y次幂
print(m.factorial(5)) # 输出: 120; factorial: 返回x的阶乘
print(m.log(10)) # 输出: 2.302585092994046; log: 返回x的自然对数
print(m.log2(16)) # 输出: 4.0; log2: 返回x的以2为底的对数
print(m.isfinite(100000000)) # 输出: True; isfinite: 如果x是有限数，则返回True，否则返回False
print(m.isinf(100000000)) # 输出: False; isinf: 如果x是无穷大，则返回True，否则返回False
# ... ...

# 数学 random 随机数
import random as r
print(r.randint(1, 10)) # 输出: 1-10之间的随机整数
print(r.random()) # 输出: 0.0-1.0之间的随机浮点数
print(r.choice([1, 2, 3, 4, 5])) # 输出: 1-5之间的随机整数

x = [1, 2, 3, 4, 5] # 定义一个列表x, 包含1, 2, 3, 4, 5
r.shuffle(x) # 随机打乱列表x中的元素
print(x) # 输出: [5, 1, 4, 2, 3]


# 数据类型转换
a = 10
b = 1.2
c = a + b
print(type(a)) # 输出: <class 'int'>
print(type(b)) # 输出: <class 'float'>
# 隐式类型转换
print(type(c)) # 输出: <class 'float'>; 自动转换为float类型, 避免精度丢失。
# 显式类型转换 int(), float(), str()
print(a + int(b), type(a + int(b))) # 输出: 11 <class 'int'>; int: 将x转换为一个整数, 舍弃小数部分。
print(float(a) + b, type(float(a) + b)) # 输出: 11.2 <class 'float'>; float: 将x转换为一个浮点数。
print(str(a) + str(b), type(str(a) + str(b))) # 输出: 101.2 <class 'str'>; str: 将x转换为一个字符串。
# print(a + str(b), type(a + str(b))) # 报错


# 逻辑运算符 and, or, not
# print(True and False) # False
# print(True or False) # True
# print(not True) # False
# print(not False) # True

# 比较运算符 ==, !=, >, <, >=, <=
# print(1==1) # True
# print(1!=1) # False
# print(1>1) # False

# 赋值运算符 =, +=, -=, *=, /=, %=, **=, //=
# a = 5
# a //= 2 # a = log2(a)
# print(a) # 2